/*
 * @Author: hucc
 * @Date: 2021-09-30 11:22:55
 * @LastEditors: hucc
 * @LastEditTime: 2021-10-05 16:31:36
 * @Description: 
 */
let obj = {}
    //defineProperty()自定义属性  括号里一般三个参数 
    //第一个为自定义对象 第二个为想要改写的对象 第三个参数为大括号包起来的属性描述符
    // Object.defineProperty(obj, 'a', {
    //     //value 对改写得对象得值的描述
    //     value: 1,
    //     //enumerable 可枚举，默认false   往外输出就得保证可枚举 true
    //     enumerable: true,
    //     //writable 可写，默认false   做了值的加减运算就得可写 true
    //     writable: true,
    //     //configurable 可配置对象，默认false   要删除某个对象就得改为可配置 true
    //     configurable: true
    // })
    // obj.a++
    //     delete obj.a;
    // console.log(obj);


//一般以下划线开头的变量名都是私有属性 不想让公众去访问
let _value = null;
Object.defineProperty(obj, 'a', {
    //enumerable 可枚举，默认false   往外输出就得保证可枚举 true
    //writable 可写，默认false   做了值的加减运算就得可写 true
    //存取描述符 set() get() 不要出现value和writable属性
    enumerable: true,
    configurable: true,
    get() {
        //先执行set()方法 再执行set()方法
        //get() 方法return 后面接的啥打印的就是啥 
        //重新给要输出对象赋值，打印结果依然是return的结果
        //重新给要输出对象的赋值 会赋值到set()函数那
        //怎么实现重新给对象的赋值 通过get()return属性出来的是重新赋的值？
        //通过全局声明一个_value属性来实现
        return _value
    },
    //newValue形参 实参是obj.a=1;所以现在newValue的值是1
    set(newValue) {
        //把newValue的值赋值给全局变量_value
        _value = newValue
    }
})

obj.a = 1
    //每次访问a就会调用get()方法
console.log('obj.a:', obj.a); //obj.a: 1